package work.linruchang.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Editor;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * 增强的正则处理工具
 *
 * @author LinRuChang
 * @version 1.0
 * @date 2021/10/29
 * @since 1.8
 **/
public class EnhanceReUtil extends ReUtil {

    /**
     * 手机号正则
     */
    public final static String MOBILE_NUMBER_REGEX = "((13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8})";

    public final static String POSITIVE_NUMBER_REGEX = "(\\d+)";


    /**
     * 校验入参是否是手机号格式
     * @param content 手机号
     * @return true手机号 false非手机号
     */
    public static boolean isMobile(String content) {
        if(StrUtil.isNotBlank(content)) {
            return isMatch(MOBILE_NUMBER_REGEX,content);
        }
        return false;
    }

    /**
     * 获取content内容中的第一个手机号字符串
     * @param content
     * @return null则说明无手机号字符串
     */
    public static String getFirstMobile(String content) {
        String mobile = null;
        if(StrUtil.isNotBlank(content)) {
            mobile = get(MOBILE_NUMBER_REGEX, content, 0);
        }
        return mobile;
    }

    /**
     * 获取最后一个匹配的正整数字符串
     * @param content 内容
     * @return
     */
    public static String getLastNumber(String content) {
        String number = null;
        List<String> findNumbers = findAll(POSITIVE_NUMBER_REGEX, content, 0);
        if(CollUtil.isNotEmpty(findNumbers)) {
            number = findNumbers.get(findNumbers.size()-1);
        }
        return number;
    }

    /**
     * 获取XML某个节点的内容 == 会去掉头尾空字符
     * @param xmlContent 准备提取XML节点内容的原始文本
     * @param nodeName 节点名
     * @param ignoreNodeCaseFlag 是否忽略节点大小写
     * @return
     */
    public static List<String> getXmlNodeContents(String xmlContent, String nodeName, boolean ignoreNodeCaseFlag) {
        if(StrUtil.isNotBlank(nodeName)) {
            String regex = StrUtil.format(ignoreNodeCaseFlag ? "(?<=((?i)<{}>)).*?(?=((?i)</{}>))":"(?<=<{}>).*?(?=</{}>)", nodeName,nodeName);
            List<String> allGroup0 = ReUtil.findAllGroup0(regex, xmlContent);
            Collection<String> result = CollUtil.edit(allGroup0, new Editor<String>() {
                @Override
                public String edit(String s) {
                    return StrUtil.trim(s);
                }
            });
            return new ArrayList<>(result);
        }
        return Collections.emptyList();
    }

    /**
     * 获取XML某个节点的内容 == 会去掉头尾空字符 == 忽略节点的大小写
     * @param xmlContent 准备提取XML节点内容的原始文本
     * @param nodeName 节点名
     * @return
     */
    public static List<String> getXmlNodeContents(String xmlContent, String nodeName) {
        return getXmlNodeContents(xmlContent,nodeName,true);
    }

    /**
     * 获取XML某个节点的内容 == 会去掉头尾空字符 == 如果有多个则取第一个节点的内容
     * @param xmlContent 准备提取XML节点内容的原始文本
     * @param nodeName 节点名
     * @param ignoreNodeCaseFlag 是否忽略节点大小写
     * @return
     */
    public static String getXmlNodeContent(String xmlContent, String nodeName, boolean ignoreNodeCaseFlag) {
        List<String> xmlNodeContents = getXmlNodeContents(xmlContent, nodeName, ignoreNodeCaseFlag);
        return CollUtil.isNotEmpty(xmlNodeContents) ? xmlNodeContents.get(0) : null;
    }

    /**
     * 获取XML某个节点的内容 == 会去掉头尾空字符 == 忽略节点的大小写 == 如果有多个则取第一个节点的内容
     * @param xmlContent 准备提取XML节点内容的原始文本
     * @param nodeName 节点名
     * @return
     */
    public static String getXmlNodeContent(String xmlContent, String nodeName) {
        return getXmlNodeContent(xmlContent,nodeName,true);
    }


}
